/*
 * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.sun.corba.se.impl.ior;

import org.omg.CORBA_2_3.portable.OutputStream;

import com.sun.corba.se.spi.protocol.CorbaServerRequestDispatcher;

import com.sun.corba.se.spi.orb.ORB;

import com.sun.corba.se.spi.ior.ObjectId;
import com.sun.corba.se.spi.ior.ObjectKey;
import com.sun.corba.se.spi.ior.ObjectKeyTemplate;

import com.sun.corba.se.impl.encoding.EncapsOutputStream;

/**
 * @author
 */
public class ObjectKeyImpl implements ObjectKey {

  private ObjectKeyTemplate oktemp;
  private ObjectId id;

  public boolean equals(Object obj) {
    if (obj == null) {
      return false;
    }

    if (!(obj instanceof ObjectKeyImpl)) {
      return false;
    }

    ObjectKeyImpl other = (ObjectKeyImpl) obj;

    return oktemp.equals(other.oktemp) &&
        id.equals(other.id);
  }

  public int hashCode() {
    return oktemp.hashCode() ^ id.hashCode();
  }

  public ObjectKeyTemplate getTemplate() {
    return oktemp;
  }

  public ObjectId getId() {
    return id;
  }

  public ObjectKeyImpl(ObjectKeyTemplate oktemp, ObjectId id) {
    this.oktemp = oktemp;
    this.id = id;
  }

  public void write(OutputStream os) {
    oktemp.write(id, os);
  }

  public byte[] getBytes(org.omg.CORBA.ORB orb) {
    EncapsOutputStream os =
        sun.corba.OutputStreamFactory.newEncapsOutputStream((ORB) orb);
    write(os);
    return os.toByteArray();
  }

  public CorbaServerRequestDispatcher getServerRequestDispatcher(ORB orb) {
    return oktemp.getServerRequestDispatcher(orb, id);
  }
}
